public class PrimeNumbers {
    public static void main(String[] args) {
        int count = 0; // 统计已打印的素数个数，用于“每行5个”
        for (int i = 2; i <= 20000; i++) { // 素数从2开始
            if (isPrime(i)) {
                System.out.print(i + " ");
                count++;
                if (count % 5 == 0) { // 每5个换行
                    System.out.println();
                }
            }
        }
        // 性能分析：最费时的是isPrime函数（需频繁判断是否为素数）。
        // 优化方法：判断时只需检查到√n（因为若n有大于√n的因数，必然有小于√n的因数），且排除偶数后步长为2。
        System.out.println("\n性能分析：最费时的函数是isPrime。\n优化思路：判断素数时，循环只需到Math.sqrt(n)，且步长设为2（跳过偶数）。");
    }

    // 判断n是否为素数
    public static boolean isPrime(int n) {
        if (n <= 1) return false;   // 1及以下不是素数
        if (n == 2) return true;    // 2是素数
        if (n % 2 == 0) return false; // 偶数（除2外）不是素数

        // 优化：只检查到√n，且步长为2（跳过偶数）
        for (int i = 3; i <= Math.sqrt(n); i += 2) {
            if (n % i == 0) {
                return false; // 能被整除，不是素数
            }
        }
        return true; // 未被整除，是素数
    }
}